package main

import (
	"bytes"
	"fmt"
)

func main()  {
	var buf bytes.Buffer
	var str string

	// 采用默认格式将其参数格式化并写入标准输出
	// 总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符
	// 返回写入的字节数和遇到的任何错误
	fmt.Println("打印内容","hello world")

	// 采用默认格式将其参数格式化并写入标准输出
	// 如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格
	// 返回写入的字节数和遇到的任何错误
	fmt.Print("打印内容", "Hello World!", "\n")

	// 根据format参数生成格式化的字符串并写入标准输出
	// 返回写入的字节数和遇到的任何错误
	/*
		%b  二进制
		%o  八进制
		%d  十进制
		%x	十六进制
		%f	浮点数 3.141593
		%g  浮点数 3.141592653589793
		%e	浮点数 3.141593e+00
		%t 	布尔值
		%c  字符(rune)
		%s  字符串
		%q  带双引号的字符串"abc"或带单引号的'c'
		%v  变量的自然形式
		%T  变量的类型
		%%  字面上的%号标志
	*/
	fmt.Printf("打印内容%s", "Hello World!\n")

	// 采用默认格式将其参数格式化并写入w
	// 总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符
	// 返回写入的字节数和遇到的任何错误
	fmt.Fprintln(&buf, "Hello", "World!")
	fmt.Println(buf.String())

	// 采用默认格式将其参数格式化并写入w
	// 如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格
	// 返回写入的字节数和遇到的任何错误
	fmt.Fprint(&buf, "Hello", "World!\n")
	fmt.Println(buf.String())

	// 根据format参数生成格式化的字符串并写入w
	// 返回写入的字节数和遇到的任何错误
	fmt.Fprintf(&buf, "Hello %s", "World!\n")
	fmt.Println(buf.String())

	// 采用默认格式将其参数格式化，串联所有输出生成 并 返回一个字符串
	// 总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符
	fmt.Sprintln("Hello", "World!")

	// 采用默认格式将其参数格式化，串联所有输出生成 并 返回一个字符串
	// 如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格
	fmt.Sprint("Hello", "World!")

	// 根据format参数生成格式化的字符串 并 返回该字符串
	ret:=fmt.Sprintf("ret=Hello %s", "World!")
	fmt.Println(ret)

	// 根据format参数生成格式化字符串并返回一个包含该字符串的错误
	err := fmt.Errorf("%s", "Error")
	fmt.Println(err)

	// 从标准输入扫描文本，将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 换行视为空白。返回成功扫描的条目个数和遇到的任何错误
	// 如果读取的条目比提供的参数少，会返回一个错误报告原因
	n,err:=fmt.Scan("Hello", "World!")
	fmt.Println(n)

	// 类似Scan，但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置
	n,err=fmt.Scanln("Hello", "World!")
	fmt.Println(n)

	// 从标准输入扫描文本，根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 返回成功扫描的条目个数和遇到的任何错误。
	fmt.Scanf("%s", "Hello")

	// 从r扫描文本，将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 换行视为空白。返回成功扫描的条目个数和遇到的任何错误
	// 如果读取的条目比提供的参数少，会返回一个错误报告原因
	fmt.Fscan(&buf, "Hello", "World!")

	// 类似Fscan，但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置
	fmt.Fscanln(&buf, "Hello", "World!")

	// 从r扫描文本，根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 返回成功扫描的条目个数和遇到的任何错误
	fmt.Fscanf(&buf, "%s", "Hello")

	// 从字符串str扫描文本，将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 换行视为空白。返回成功扫描的条目个数和遇到的任何错误
	// 如果读取的条目比提供的参数少，会返回一个错误报告原因
	fmt.Sscan(str, "Hello", "World!")

	// 类似Sscan，但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置
	fmt.Sscanln(str, "Hello", "World!")

	// 从字符串str扫描文本，根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数
	// 返回成功扫描的条目个数和遇到的任何错误
	fmt.Sscanf(str, "%s", "Hello")

	var str1 = "hello"
	fmt.Printf("%v\n",str1)	//值的默认格式表示
	fmt.Printf("%#v\n",str1)	//值的Go语法表示
	fmt.Printf("%+v\n",str1)	//类似%v，但输出结构体时会添加字段名
}
